1use serde::{Deserialize, Serialize};
2
3#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
4pub enum Operator {
5 Assign,
7 PlusAssign,
8 MinusAssign,
9 StarAssign,
10 SlashAssign,
11 PercentAssign,
12 StarStarAssign,
13 LeftShiftAssign,
14 RightShiftAssign,
15 UnsignedRightShiftAssign,
16 BitwiseAndAssign,
17 BitwiseOrAssign,
18 BitwiseXorAssign,
19
20 Equal,
22 NotEqual,
23 StrictEqual,
24 StrictNotEqual,
25 LessThan,
26 LessThanEqual,
27 GreaterThan,
28 GreaterThanEqual,
29
30 LogicalAnd,
32 LogicalOr,
33 LogicalNot,
34
35 Plus,
37 Minus,
38 Star,
39 Slash,
40 Percent,
41 StarStar,
42
43 BitwiseAnd,
45 BitwiseOr,
46 BitwiseXor,
47 LeftShift,
48 RightShift,
49 UnsignedRightShift,
50 BitwiseNot,
51
52 Increment,
54 Decrement,
55
56 Arrow,
58 OptionalChaining,
59 Spread,
60 Rest,
61 PrivateField,
62}
63
64impl Operator {
65 pub fn as_str(&self) -> &'static str {
66 match self {
67 Operator::Assign => "=",
68 Operator::PlusAssign => "+=",
69 Operator::MinusAssign => "-=",
70 Operator::StarAssign => "*=",
71 Operator::SlashAssign => "/=",
72 Operator::PercentAssign => "%=",
73 Operator::StarStarAssign => "**=",
74 Operator::LeftShiftAssign => "<<=",
75 Operator::RightShiftAssign => ">>=",
76 Operator::UnsignedRightShiftAssign => ">>>=",
77 Operator::BitwiseAndAssign => "&=",
78 Operator::BitwiseOrAssign => "|=",
79 Operator::BitwiseXorAssign => "^=",
80 Operator::Equal => "==",
81 Operator::NotEqual => "!=",
82 Operator::StrictEqual => "===",
83 Operator::StrictNotEqual => "!==",
84 Operator::LessThan => "<",
85 Operator::LessThanEqual => "<=",
86 Operator::GreaterThan => ">",
87 Operator::GreaterThanEqual => ">=",
88 Operator::LogicalAnd => "&&",
89 Operator::LogicalOr => "||",
90 Operator::LogicalNot => "!",
91 Operator::Plus => "+",
92 Operator::Minus => "-",
93 Operator::Star => "*",
94 Operator::Slash => "/",
95 Operator::Percent => "%",
96 Operator::StarStar => "**",
97 Operator::BitwiseAnd => "&",
98 Operator::BitwiseOr => "|",
99 Operator::BitwiseXor => "^",
100 Operator::LeftShift => "<<",
101 Operator::RightShift => ">>",
102 Operator::UnsignedRightShift => ">>>",
103 Operator::BitwiseNot => "~",
104 Operator::Increment => "++",
105 Operator::Decrement => "--",
106 Operator::Arrow => "=>",
107 Operator::OptionalChaining => "?.",
108 Operator::Spread => "...",
109 Operator::Rest => "...",
110 Operator::PrivateField => "#",
111 }
112 }
113
114 pub fn precedence(&self) -> u8 {
115 match self {
116 Operator::LogicalOr => 1,
117 Operator::LogicalAnd => 2,
118 Operator::BitwiseOr => 3,
119 Operator::BitwiseXor => 4,
120 Operator::BitwiseAnd => 5,
121 Operator::Equal
122 | Operator::NotEqual
123 | Operator::StrictEqual
124 | Operator::StrictNotEqual => 6,
125 Operator::LessThan
126 | Operator::LessThanEqual
127 | Operator::GreaterThan
128 | Operator::GreaterThanEqual => 7,
129 Operator::LeftShift | Operator::RightShift | Operator::UnsignedRightShift => 8,
130 Operator::Plus | Operator::Minus => 9,
131 Operator::Star | Operator::Slash | Operator::Percent => 10,
132 Operator::StarStar => 11,
133 Operator::LogicalNot | Operator::BitwiseNot => 12,
134 Operator::Increment | Operator::Decrement => 13,
135 _ => 0,
136 }
137 }
138
139 pub fn is_assignment(&self) -> bool {
140 matches!(
141 self,
142 Operator::Assign
143 | Operator::PlusAssign
144 | Operator::MinusAssign
145 | Operator::StarAssign
146 | Operator::SlashAssign
147 | Operator::PercentAssign
148 | Operator::StarStarAssign
149 | Operator::LeftShiftAssign
150 | Operator::RightShiftAssign
151 | Operator::UnsignedRightShiftAssign
152 | Operator::BitwiseAndAssign
153 | Operator::BitwiseOrAssign
154 | Operator::BitwiseXorAssign
155 )
156 }
157
158 pub fn is_comparison(&self) -> bool {
159 matches!(
160 self,
161 Operator::Equal
162 | Operator::NotEqual
163 | Operator::StrictEqual
164 | Operator::StrictNotEqual
165 | Operator::LessThan
166 | Operator::LessThanEqual
167 | Operator::GreaterThan
168 | Operator::GreaterThanEqual
169 )
170 }
171
172 pub fn is_logical(&self) -> bool {
173 matches!(
174 self,
175 Operator::LogicalAnd | Operator::LogicalOr | Operator::LogicalNot
176 )
177 }
178
179 pub fn is_arithmetic(&self) -> bool {
180 matches!(
181 self,
182 Operator::Plus
183 | Operator::Minus
184 | Operator::Star
185 | Operator::Slash
186 | Operator::Percent
187 | Operator::StarStar
188 )
189 }
190}